package simulacao;

import java.util.ArrayList;
import java.util.Collections;

import estrategias.Estrategia;

public class Jogador {
	
	private int numJogador;
	private int tipo;
	private double pSeEnganar = 0.0;
	private Histograma histograma;
	private ArrayList<Integer> jogadasAdversario;
	private double crencas[];
	private long[] jogadas = {0, 0};
	private long totalJogadas;
	private ArrayList<Double> payoffs;
	private Estrategia estrategia;
	
	public Jogador(){
		this.jogadasAdversario = new ArrayList<Integer>();
		this.histograma = new Histograma();
		this.crencas = new double[1];
		this.crencas[0] = 1.0;
		this.payoffs = new ArrayList<Double>();
	};


	public int getJogada(){
		int jogadaIntencionada = this.estrategia.getJogada();
		boolean punicaoAtiva = this.estrategia.getPunicaoAtiva();
		double rand = Math.random();
		int jogadaEfetiva = (rand<pSeEnganar && !punicaoAtiva) ? (jogadaIntencionada+1)%2 : jogadaIntencionada;
		jogadas[jogadaEfetiva]++;
		totalJogadas++;
		return jogadaEfetiva;
	}
		
	public void definirTipo(){
		double rand = Math.random();
		double cdf = 0.0;
		
		for(int i = 0 ; i < crencas.length; i++){
			cdf +=crencas[i];
			if(rand < cdf){
				tipo = i;
				break;
			}
		}
	}
	
	public int getNumJogador() {
		return numJogador;
	}

	public void setNumJogador(int numJogador) {
		this.numJogador = numJogador;
	}

	public int getTipo() {
		return tipo;
	}

	public void setTipo(int tipo) {
		this.tipo = tipo;
	}

	public double getpSeEnganar() {
		return pSeEnganar;
	}

	public void setpSeEnganar(double pSeEnganar) {
		this.pSeEnganar = pSeEnganar;
	}

	public Histograma getHistograma() {
		return histograma;
	}
	
	public void setHistograma() {
		this.histograma = new Histograma();
	}
	
	public ArrayList<Integer> getJogadasAdversario(){
		return jogadasAdversario;
	}
	
	public int getJogadaAdversario(int rodada){
		return jogadasAdversario.get(rodada);
	}
	
	public void adicionaJogadaAdversario(int jogadaAdversario) {
		jogadasAdversario.add(jogadaAdversario);
		estrategia.setJogadaAnteriorAdversario(jogadaAdversario);
	}
	
	public double getDistribuicaoJogadas(int estrategia){
		return 100.0*((double)jogadas[estrategia])/((double)totalJogadas);
	}

	public double[] getcrencas() {
		return crencas;
	}

	public void setCrencas(double crencas[]) {
		this.crencas = crencas;
	}
	
	public void adicionaPayoff(double payoff){
		histograma.adicionaEntrada(payoff);
		payoffs.add(payoff);
	}
	
	public void zerarPayoffs(){
		payoffs = new ArrayList<Double>();
	}

	public Estrategia getEstrategia() {
		return estrategia;
	}

	public void setEstrategia(Estrategia estrategia) {
		this.estrategia = estrategia;
	}
	
	public double getVar(int index){
		Collections.sort(payoffs);
		return payoffs.get(index);
	}

}
